package com.gitee.zhanyao.codebase.java.reflect.util;

import com.gitee.zhanyao.codebase.java.reflect.reflect.ReflectFunction;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.reflect.MethodUtils;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
public class EnumUtil {

    /**
     * 将枚举项中指定字段转换为键值对
     *
     * @param clazz                    枚举类
     * @param keyGetMethodNameLambda   key 获取值的方法
     * @param valueGetMethodNameLambda value 获取值的方法
     * @param <T>
     * @return
     */
    public static <T, R> List<Map<String, String>> convertToItems(Class<T> clazz,
            ReflectFunction<T, R> keyGetMethodNameLambda, ReflectFunction<T, R> valueGetMethodNameLambda) {
        String keyGetMethodName = ReflectFunction.getMethodName(keyGetMethodNameLambda);
        String valueGetMethodName = ReflectFunction.getMethodName(valueGetMethodNameLambda);
        return convertToItems(clazz, keyGetMethodName, valueGetMethodName);
    }

    /**
     * 将枚举项中指定字段转换为键值对
     *
     * @param clazz              枚举类
     * @param keyGetMethodName   key 获取值的方法
     * @param valueGetMethodName value 获取值的方法
     * @param <T>
     * @return
     */
    public static <T> List<Map<String, String>> convertToItems(Class<T> clazz, String keyGetMethodName, String valueGetMethodName) {
        List<Map<String, String>> reuslt = new ArrayList<>();
        Map<String, String> map;
        if (clazz.isEnum()) {
            T[] tm = clazz.getEnumConstants();
            for (T t : tm) {
                map = new HashMap<>();
                String key = getInvokeValue(t, keyGetMethodName);
                String value = getInvokeValue(t, valueGetMethodName);
                map.put(key, value);
                reuslt.add(map);
            }
        }
        return reuslt;
    }

    /**
     * 获取方法值
     *
     * @param t
     * @param methodName
     * @return
     */
    public static <T> String getInvokeValue(T t, String methodName) {
        String text = null;
        try {
            Method method = MethodUtils.getAccessibleMethod(t.getClass(), methodName);
            text = String.valueOf(method.invoke(t));
        } catch (Exception e) {
            log.info(e.getMessage(), e);
        }
        return text;
    }

}
